// node 36_实现连续的数字有规律的输出.js

// 解析字符串，
// 如果有连续数字的话，就取连续的第一个数和最后一个数，中间用~隔开，
// 如果不连续就用,隔开
// 例：输入：'1,2,3,5,6,7,10' 输出：'1~3,5~7,10'

let str = '1,2,3,5,6,7,10'

//方法1
//reduce
function operateString1(s) {
    let res = s.split(',').reduce((pro,item,index,arr)=>{
        if(index === 0) return item
        if(+arr[index-1] + 1 === +item){
            if(pro[pro.length-1] === '~') return pro
            return pro + '~'
        }else{
            if(pro[pro.length-1] === '~') pro += arr[index-1]
            return pro + ',' + item
        }
    })
    return res
}
console.log(operateString1(str))

//方法1
//map
function operateString2(str) {
    let arr = str.split(',').map(i => +i)
    let tmp = arr[0]//记录最近一组连续数字的第一个数字
    let res = []
    arr.map((item,key,arr)=>{
        if(item+1 !== arr[key+1]){
            if(tmp !== item){
                res.push(`${tmp}~${item}`)
            }else{
                res.push(`${item}`)
            }
            tmp = arr[key+1]
        }
    })
    return res.join(',')
}
console.log(operateString2(str))

//方法3
//reduce+replace
function operateString3(str) {
    let newStr = str.split(',').reduce((pro,item,key,arr)=>{
        if(key === 0) return item
        if(item - 1 == arr[key - 1]){
            return pro + `~${item}`
        }else{
            return pro + `,${item}`
        }
    },'')
    let res = newStr.split(',').map((item)=>{
        let reg = /(\d{1,})(~\d{1,})*(~\d{1,})/
        return item.replace(reg,`$1$3`)
    }).join(',')
    return res
}
console.log(operateString3(str))